package xx.procustom.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // 表单提交
        http.formLogin()
                // 自定义 登录请求参数
                .usernameParameter("username1")
                .passwordParameter("password1")
                // 当发现/login时，认为是登录请求，必须是和表单提交的地址一样，就回去执行userDetailServiceImpl 里面的登录逻辑
                .loginProcessingUrl("/login")
                // 自定义登录页面
                .loginPage("/login.html")
                // 登录成功后，跳转到那个页面，必须是要post请求
                .successForwardUrl("/home")
                // 登录失败后，跳转到那个页面，必须是要post请求
                .failureForwardUrl("/toError");

        // 授权认证
        http.authorizeRequests()
                // 放行错误请求页面
                .antMatchers("/error.html").permitAll()
                // 放行 /login.html ,即：不需要登录即可访问
                .antMatchers("/login.html").permitAll()
                // 任何请求都需要验证即：需要登录后才可以访问。
                .anyRequest().authenticated();

        // 关闭 csrf 保护
        http.csrf().disable();
    }
}
